package com.yesep.learn.design.creational.singleton;

/**
 * 双检锁线程安全的懒汉式单例
 * 双检锁（Double-Checked Locking）是一种常用的实现线程安全的懒汉式单例模式的方法。
 * 这种方法利用了 volatile 关键字和 synchronized 关键字来保证线程安全，并且只在第一次实例化时创建单例对象，从而提高了性能。
 */
public class DoubleCheckedLockLazySingleton {
    //volatile 关键字: 用于标记 instance 变量，确保多个线程可以正确地处理该变量的可见性和禁止指令重排。
    private static volatile DoubleCheckedLockLazySingleton instance;

    // 构造函数私有化
    private DoubleCheckedLockLazySingleton() {
        // 防止反射攻击
        if (instance != null) {
            throw new IllegalStateException("Singleton instance already exists!");
        }
    }

    // 提供公共的静态方法来获取单例对象
    public static DoubleCheckedLockLazySingleton getInstance() {
        // 第一次检查：如果实例已经存在，则直接返回
        if (instance == null) {
            // 同步块：确保线程安全
            synchronized (DoubleCheckedLockLazySingleton.class) {
                // 第二次检查：确保实例尚未创建
                if (instance == null) {
                    instance = new DoubleCheckedLockLazySingleton();
                }
            }
        }
        return instance;
    }
}
